Interactive Extensions (Ix)
2010年にReactive Extensions(Rx)が最初にリリースされた直後、.NETにTask<T>が導入された際に、チームは非同期でプルベースの列挙可能なシーケンスのコンセプトを検討しました。その結果、IAsyncEnumerable<T>インターフェイスがInteractive Extensions(Ix)として知られる技術に導入されました。
Shortly after the initial release of Reactive Extensions (Rx) in 2010, upon the introduction of Task<T> in .NET, the team looked into the concept of asynchronous, pull-based enumerable sequences. This led to the introduction of the IAsyncEnumerable<T> interface in a technology known as Interactive Extensions (Ix):
code:C#
// Original Ix interfaces for asynchronous streams (2011).
public interface IAsyncEnumerable<out T>
{
IAsyncEnumerator<T> GetEnumerator();
}
public interface IAsyncEnumerator<out T> : IDisposable
{
T Current { get; }
Task<bool> MoveNextAsync(CancellationToken token);
}
これに加えて、Ix.NETはIAsyncEnumerable<T>の拡張メソッドとしてLINQクエリ演算子を提供しています。この構造は、Entity Frameworkがコアの依存関係として採用したように、ネットワークの境界を越えたイベントの非同期取得を扱うときに便利です。それから5年以上が経ち、C# 5.0でasyncとawaitが導入された後、言語設計チームはawait foreachコンストラクトによるファーストクラスの言語サポートを検討し始め、最終的にC# 8.0でAsynchronous Streams作業の一部として出荷されました。また、IAsyncDisposable と ValueTask<bool> を使ったインターフェースの再検討も含まれています。
On top of this, Ix.NET provides LINQ query operators as extension methods on IAsyncEnumerable<T>. This construct is useful when dealing with asynchronous retrieval of events across networking boundaries as was embraced by the Entity Framework as a core dependency. More than 5 years later, after the introduction of async and await in C# 5.0, the language design teams started considering first-class language support through an await foreach construct, which ultimately shipped in C# 8.0 as part of the Asynchronous Streams work. This also includes a revisit of the interfaces using IAsyncDisposable and ValueTask<bool>.
code:C#
// Asynchronous Streams in C# 8.0 (2019).
public interface IAsyncEnumerable<out T>
{
IAsyncEnumerator<T> GetEnumerator(CancellationToken token);
}
public interface IAsyncEnumerator<out T> : IAsyncDisposable
{
T Current { get; }
ValueTask<bool> MoveNextAsync();
}
IAsyncEnumerable<T>インターフェイスは、Microsoftのいくつかのチームによって独立して発明(または発見?)されました。最初のチームはCloud Programmability Teamで、Rx.NETと一緒にNuGetパッケージとして出荷しました。その後、Service Fabricチームは、信頼性の高いコレクションのサポートを構築する際に、非同期のプルベースのシーケンスの列挙の必要性を発見しました。この構造は、数年後にC# 8.0に搭載されました。
The IAsyncEnumerable<T> interface has been invented (or discovered?) independently by a few teams at Microsoft. The first was the Cloud Programmability Team where we shipped it as a NuGet package alongside Rx.NET. Later, the Service Fabric team discovered the need for asynchronous pull-based enumeration of sequences when building support for reliable collections. The construct ultimately landed in C# 8.0 several years later.